using System;
using System.Collections;
using HCore.Unity.Behaviour;
using HCore.Unity.Core;
using HCore.Unity.Manager;
using HCore.Unity.Manager.Support.Loader;
using UnityEngine;
using UnityEngine.Networking;

namespace UI.UIMenu
{
    [BindPrefab]
    public class ImageCardVisual : SmartMonoBehaviour
    {
        /// <summary>
        ///     资源地址
        /// </summary>
        [SerializeField] public string Uri;

        /// <summary>
        ///     标题
        /// </summary>
        [SerializeField] public string Title;

        /// <summary>
        ///     加载精灵
        /// </summary>
        [SerializeField] public Sprite LoadingSprite;

        /// <summary>
        ///     加载精灵的颜色
        /// </summary>
        [SerializeField] public Color LoadingColor = Color.gray;

        /// <summary>
        ///     是否启用加载进度，要和 LoadingSprite 一起使用
        /// </summary>
        [SerializeField] public bool LoadingImageFill;


        private ComponentData mImage;
        private ComponentData mLoading;
        private ComponentData mTitle;

        private void Awake()
        {
            // 获取图像、加载指示器和标题的引用
            mImage = Get("GridLayout/ImageLayout/Image");
            mLoading = Get("GridLayout/ImageLayout/Loading");
            mTitle = Get("GridLayout/TitleLayout/Title");
        }

        private void Start()
        {
            // 如果加载指示器的精灵为空，则禁用加载指示器
            if (LoadingSprite == null)
            {
                mLoading.SetActive(false);
            }
            else
            {
                // 否则，设置加载指示器的精灵和颜色
                mLoading.SetImageSprite(LoadingSprite);
                mLoading.SetImageColor(LoadingColor);
            }

            // 设置图像的精灵为加载指示器的精灵
            mImage.SetImageSprite(LoadingSprite);

            // 设置标题文本
            mTitle.SetText(Title);

            // 如果EnableImageFill为true，则启用加载效果，并且设置加载填充量为0
            if (LoadingImageFill) SetLoadingFillAmount(0);
            // 否则，加载效果
            else mLoading.SetActive(false);

            // 如果Uri不为空，则设置图片
            if (!string.IsNullOrEmpty(Uri)) SetImage(new Uri(Uri));
        }


        /// <summary>
        ///     加载指定URI的图像。
        /// </summary>
        /// <param name="imageUri">图像的URI。</param>
        public void SetImage(Uri imageUri)
        {
            // 启动一个协程来请求数据，使用ResourceLoader.RequestData方法。
            // RequestTexture是一个回调方法，用于处理请求到的纹理数据。
            // new DownloadHandlerTexture(true)创建一个下载处理器，用于处理图像下载。
            // SetLoadingFillAmount是一个回调方法，用于设置加载进度。
            StartCoroutine(ResourceLoader.RequestData(imageUri, RequestTexture,
                new DownloadHandlerTexture(true), SetLoadingFillAmount));
        }

        /// <summary>
        ///     设置标题的方法。
        /// </summary>
        /// <param name="title">要设置的标题文本。</param>
        public void SetTitle(string title)
        {
            mTitle.SetText(title);
        }


        /// <summary>
        ///     设置加载图像的填充量。
        /// </summary>
        /// <param name="fillAmount">要设置的填充量值。</param>
        private void SetLoadingFillAmount(float fillAmount)
        {
            // 如果禁用了图像填充并且加载精灵为空，则直接返回
            if (!LoadingImageFill && LoadingSprite == null) return;

            // 设置加载图像的填充量，并确保其在0到1之间
            mLoading.Image.fillAmount = Mathf.Clamp01(fillAmount);
        }


        /// <summary>
        ///     异步请求纹理并处理。
        /// </summary>
        /// <param name="request">UnityWebRequest请求对象。</param>
        /// <returns>协程迭代器。</returns>
        private IEnumerator RequestTexture(UnityWebRequest request)
        {
            yield return null;

            // 从请求中获取原始纹理
            var texture = DownloadHandlerTexture.GetContent(request);
            yield return null;
            // 调整纹理大小
            var newTexture = GameUtils.ResizeTexture(texture, 0.12f);
            yield return null;
            // 创建精灵
            var sprite = GameUtils.CreateSprite(newTexture, new Rect(0, 0, newTexture.width, newTexture.height));
            yield return null;
            // 设置图像精灵
            mImage.SetImageSprite(sprite);
            // 隐藏加载动画
            mLoading.SetActive(false);

            ImageDownloadCompleteEvent?.Invoke(texture);

            yield return null;

            // 销毁原始纹理，延迟1秒后销毁
            Destroy(texture, 1f);

            yield return null;
        }

        #region Events

        public event Action<Texture> ImageDownloadCompleteEvent;

        public void AddImageDownloadCompleteEvent(Action<Texture> @event)
        {
            ImageDownloadCompleteEvent -= @event;
            ImageDownloadCompleteEvent += @event;
        }

        #endregion
    }
}